package com.udima.reglocation;

import java.text.DecimalFormat;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.gson.Gson;
import com.udima.reglocation.entities.Track;
import com.udima.reglocation.rest.RestGpsDates;
import com.udima.reglocation.util.AsyncTaskCompleteListener;
import com.udima.reglocation.util.HttpAsyncTask;
import com.udima.reglocation.util.SQLiteDatabaseHandler;

/**
 * Clase que permite al usuario visualizar cualquier trayecto de los que están almacenados en el servidor. La información
 * se obtiene con una llamada asíncrona que puede ser de dos maneras:
 *    -Sin parámtros de fecha:			   El servidor devuelve la última ruta almacenada
 *    -Conparámetros (fecha inicio - fin): El servidor proporciona un listado de rutas almacenadas en las fechas
 *                                         que cumplen las condiciones del filtrado permitiendo seleccionar una para
 *                                         su posterior visualización en el mapa de Google.
 * 
 * Esta pantalla dispone de un mapa como elemento visual para representar el recorrido que se consulta 
 * 
 * @author luis
 *
 */

public class ListTrackActivity extends android.support.v4.app.FragmentActivity implements AsyncTaskCompleteListener{
	
	private Activity activity=this;
    private Button   btnList;
    private Button   btnGetList;
    private EditText inputTracks;
    private EditText inputDateFrom;
    private EditText inputDateTo;
    
    private SQLiteDatabaseHandler db;
    
    // Instancia al mapa de Google
    private GoogleMap googleMap;

    /**
     * Evento que se lanza en la creación de la clase. Genera el mapa y posiciona todos los puntos del
     * recorrido que se obtiene del servidor
     */ 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_track_activity);      
        db = new SQLiteDatabaseHandler(this);
        
        try {
            // Carga del mapa
            initilizeMap();
        } catch (Exception e) {
            e.printStackTrace();
        }

        inputTracks   = (EditText) findViewById(R.id.txtEmail);
        btnList       = (Button) findViewById(R.id.btnList);
        btnGetList    = (Button) findViewById(R.id.btnGetList);
        inputDateFrom = (EditText) findViewById(R.id.dateFrom);
        inputDateTo   = (EditText) findViewById(R.id.dateTo);
        
        btnList.setOnClickListener(new View.OnClickListener() {
 
        	/**
        	 * Función listener del botón de obtención de datos 
        	 */
            public void onClick(View view) {
            	Editable aux;
            	Double lastLatitude  = (double) 0;
            	Double lastLongitude = (double) 0;
            	
            	//Lista de todos los puntos del recorrido que se va a representar
            	List <Track> tracks = db.getAllTracks();
            	
            	//Bucle para el manejo de cada una de las posiciones
            	for(Track tr : tracks) {
            		aux = inputTracks.getText();
            		inputTracks.setText("");
            		inputTracks.setText(aux  
            				 + tr.getLatitude().toString() + '-'
            				 + tr.getLongitude().toString() + '-'
            				 + tr.getAltitude().toString() + '-'
            				 + tr.getSpeed().toString() + '-'
            				 + tr.getTime()
            				 +'\n');
            		 
            		// Creación del marcador
            		MarkerOptions marker = new MarkerOptions().position(new LatLng(tr.getLatitude(), tr.getLongitude())).title("Hello Maps ");
            		 
            		// Se añade el marcador
            		googleMap.addMarker(marker);
            		
            		//Almacenaje de la última latitud y longitud obtenida
            		lastLatitude  = tr.getLatitude();
            		lastLongitude = tr.getLongitude();

            	}
            	
        		// Se posiciona el mapa el el último punto que se ha localizado en la lista de datos
                googleMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lastLatitude, lastLongitude)));
 
                // Se fija el nivel de zoom de manera proporcional a la cantidad de recorrido que se quiere mostrar
                googleMap.animateCamera(CameraUpdateFactory.zoomTo(14));
                
            }
        });
        
        btnGetList.setOnClickListener(new View.OnClickListener() {
        	 
        	/**
        	 * Función listener del botón de obtención de datos 
        	 */
            public void onClick(View view) {
            	
            	// Instancia a SharedPreferences
			    SharedPreferences pref = getApplicationContext().getSharedPreferences("com.udima.reglocation", MODE_PRIVATE);
			    
				//Asignación de valores a la clase "restGpsFechas"
				RestGpsDates restGpsFechas = new RestGpsDates();
				//restGpsFechas.setUserId("2");
				//restGpsFechas.setInitDate("2014-06-02T22:00:00.000Z");
				//restGpsFechas.setEndDate("2014-06-03T22:00:00.000Z");
				restGpsFechas.setUserId(pref.getString("userId",null));
				if(inputDateFrom.getText().toString().matches("")){
					restGpsFechas.setInitDate(null);
				}
				else{
					restGpsFechas.setInitDate(inputDateFrom.getText() + "T00:00:00.000Z");	
				}
				
				if(inputDateTo.getText().toString().matches("")){
					restGpsFechas.setEndDate(null);
				}
				else{
					restGpsFechas.setEndDate(inputDateTo.getText() + "T23:59:59.000Z");	
				}

			    //Serialización de la clase en formato Json dentro de la cadena "loginUsuario"
				Gson gson = new Gson();
				String trackDates = gson.toJson(restGpsFechas);
            	
            	//Definición del callback particular al envio de parámetros de consulta del recorrido
				final AsyncTaskCompleteListener callback = new AsyncTaskCompleteListener() {
					
					@Override
					public void onTaskComplete(String result) {

						try {
							JSONObject json = new JSONObject(result);
							
							//Si la respuesta ha sido satisfactoria, entonces se procesa el resultado
							if(json.getString("responseSuccessful")=="true"){
								
								//Ponemos la fecha de la respuesta en los input de fechas, para cuando se ha consultado
								//sin introducir ningún valor de búsqueda
								//inputDateFrom.setText(json.getString("initDate"));
								//inputDateTo.setText(json.getString("endDate"));
								
								JSONArray jsonGpsData = json.getJSONArray("gpsData");
								
								LatLngBounds.Builder builder = new LatLngBounds.Builder();
								
								//Bucle para posicionar cada punto del array
								for(int i = 0 ; i < jsonGpsData.length() ; i++){
							        JSONObject p = (JSONObject)jsonGpsData.get(i);							        

							        // Creación del marcador
				            		MarkerOptions marker = new MarkerOptions().position(new LatLng(Double.parseDouble(p.getString("lat")), Double.parseDouble(p.getString("lon")))).title("Velocidad: " + roundTwoDecimals(Double.parseDouble(p.getString("speedFromPrevious"))) + " km/h" );
				            		 
				            		// Se añade el marcador al mapa
				            		googleMap.addMarker(marker);
				            		
				            		//Se incluye al constructor para el posterior manejo
				            		builder.include(new LatLng(Double.parseDouble(p.getString("lat")), Double.parseDouble(p.getString("lon"))));
				            		
							    }
								
								//Procesado del grupo de puntos para ajustar el mapa a estos
								LatLngBounds bounds = builder.build();
						        int padding = 200; // Desplazamiento desde el borde del mapa en píxeles
						        CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
						        googleMap.moveCamera(cu);
						        googleMap.animateCamera(cu);
								
							}
						} catch (JSONException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
		        };
            	
				//Ejecución de la consulta al servicio rest de obtención de recorridos GPS para unas fechas determinadas
				new HttpAsyncTask(activity) {

		            @Override
		            protected void onPostExecute(String result) {
		                super.onPostExecute(result);
		                callback.onTaskComplete(result);
		            }
		        }.execute(pref.getString("appBaseUrl",null) + "/rest/admin/gps/",trackDates);                
            }
        });
    }
    
    //Función para redondear a dos decimales los double
    double roundTwoDecimals(double d) {
        DecimalFormat twoDForm = new DecimalFormat("#.##");
        return Double.valueOf(twoDForm.format(d));
    }

	//Funcion para cargar el mapa
	private void initilizeMap() {
        if (googleMap == null) {
            googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
 
            // Comprueba si el mapa se ha creado satisfactoriamente
            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),"Error! no se puede cargar el mapa", Toast.LENGTH_SHORT).show();
            }
        }
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        initilizeMap();
    }

	@Override
	public void onTaskComplete(String result) {
		// TODO Auto-generated method stub
		
	}
 
}